//
//  SinaUserAccountViewModel.swift
//  mySina
//
//  Created by 刘莹 on 2016/11/16.
//  Copyright © 2016年 liuying. All rights reserved.
//
/*
 1.封装数据逻辑处理
 2.封装网络请求
 3.封装数据缓存
 */
import UIKit
import SVProgressHUD

class SinaUserAccountViewModel: NSObject {
//视图模型需要引用 模型对象->视图模型需要处理数据逻辑
    var userAccount : SinaUserAccount?
    //单例对象,全局只有一个登陆的用户,只存储一个用的account.plist文件,一旦用户注销登陆之后就应该删除account.plist
    static let shared:SinaUserAccountViewModel = SinaUserAccountViewModel()
    //MARK: -
    //MARK: - 重写构造函数,在用户已经登录的情况下给模型赋值
    override init(){
    
        super.init()
        
        //将磁盘数据保存在内存中(保证以后再判断是否登录的时候,不在访问磁盘)
        userAccount = self.loadUserAccount()
    
    }
    var access_token : String?{
    
        return userAccount?.access_token
    }
    //增加一个用户纯种URL类型的头像地址
    var headURL: URL?{
    
        return URL(string: userAccount?.avatar_large ?? "")
    }
    //MARK: -
    //MARK: - 判断用户是否登录
    var userLogin:Bool{
        
        //满足以下条件就认为用户已经登录:token存在并且没有过期
        if userAccount?.access_token != nil && isExpires == false {
            
            return true
        }
        //默认灭有登录
        return false
    }
    //MARK: -
    //MARK: - 判断令牌是否过期
    var isExpires:Bool{
        //满足以下条件就认为没有过期
        //过期日期>当前日期就没有过期  即降序
        if userAccount?.expires_date?.compare(Date()) == ComparisonResult.orderedDescending{
        
            return false
        }
    //默认过期
        return true
    }
    
    
    //MARK: -
        //MARK: -
    //MARK: - 2.通过code和secret和回调页来获取用户Token
    func loadAccessToken(code:String,finished:@escaping (Bool) -> ()){
        let urlString = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id":client_id,
                          "client_secret":client_secret,
                          "code":code,
                          "redirect_uri":redirect_uri]
        SinaNetWorkTools.shared.request(method: .POST, urlString: urlString, parameter: parameters) { (responseObj, error) in
            
            if error != nil{
                
                //SVProgressHUD.showError(withStatus: "没网...")
                finished(false)
                // print(error)
                return
            }
            //请求成功
            //print(responseObj)
            //使用access_token和uid来请求用户信息
            self.loadUserInfoDict(dict: responseObj as! [String:Any],loadUserInfofinished: finished)
        }
        
        
        
    }
    
    //MARK: -
    //MARK: - 3.用access_token和uid来请求用户信息
    private func loadUserInfoDict(dict : [String : Any],loadUserInfofinished:@escaping (Bool) ->()){
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        let parameters = ["access_token":token,
                          "uid":uid]
        // print("parameters:")
        //print(parameters)
        SinaNetWorkTools.shared.request(method: .GET, urlString: urlString, parameter: parameters) { (responseObj, error) in
            
            if  error != nil{
                
                //SVProgressHUD.showError(withStatus: "没网...")
                //  print("访问用户信息出错了:")
                // print(error)
                //执行失败的回调
                loadUserInfofinished(false)
                return
            }
            //获取用户信息成功
            // print("获取用户信息成功:")
            //print("responseObj=--------")
            //print(responseObj)
            //将用户信息存储在本地
            //将授权之后的字典和用户信息的字典合并 之后再存储
            
            //print(dict)
            var userInfoDict = responseObj as! [String:Any]//此处response一定有值
            for(key,value) in dict{
                userInfoDict[key] = value
                
            }
            //print("合并后dict:")
//            print("-------------")
//             print(userInfoDict)
//            print("-------------")
            let Account = SinaUserAccount.init(dict: userInfoDict)
            self.saveUserAccount(userAccount: Account)
            self.userAccount = Account
            
          //执行成功的回调
            loadUserInfofinished(true)
            
            
        }
        
    }
    //MARK: -
    //MARK: - 存储用户模型对象到本地account.plist中
    private func saveUserAccount(userAccount:SinaUserAccount){
        
        //存储在沙盒的Document或者Library,temp不会备份
        //拼接文件路径的方法String没有   要转换为NSString
        //使用默认转换的前提:被转换的类型不能为可选类型
        //存储自定义对象,自定义对象必须遵守NSCoding协议,实现协议方法
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
        //print(path)
    }
    //MARK: -
    //MARK: - 从本地account.plist中加载用户信息
    private func loadUserAccount() -> SinaUserAccount?{
        
        //调用解档方法
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        //print("path:" + path)
        if let userAccount = account as? SinaUserAccount{
            
            return userAccount
        }
        return nil
    }
    
    
    
}
